/*
 * 描述： <描述>
 * 修改人： rain
 * 修改时间： 2016年9月11日
 * 项目： rainhy-core
 */
package com.rainhy.core.util;

import java.util.Map;
import java.util.WeakHashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 正则表达式工具
 * 
 * @author rain
 * @version [版本号, 2016年9月11日]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
public abstract class PatternUtils {
    
    /** 正则表达式枚举 */
    public enum RegExp {
        中文("^[\\u4E00-\\u9FA5\\uF900-\\uFA2D]+$"),// 只能判断部分CJK字符（CJK统一汉字）
        中文标点("^[\\u4E00-\\u9FA5\\uF900-\\uFA2D，。：；“”‘’？｛｝【】（）！￥《》、＋－＝]+$"),// 只能判断部分CJK字符（CJK统一汉字）和部分汉字标点符号
        电子邮件("^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$"),// 电子邮件
        单词("^\\w+$"),// [A-Za-z0-9_] 大小写字母数字下划线
        单词点("^[\\w\\.]+$"),// [A-Za-z0-9_.] 大小写字母数字下划线点
        单词点中文("^[\\w\\.\\u4E00-\\u9FA5\\uF900-\\uFA2D]+$"),//  [A-Za-z0-9_.\u4E00-\u9FA5\uF900-\uFA2D] 大小写字母数字下划线点中文
        ;
        
        /** 正则表达式 */
        private String regExp;
        
        RegExp(String regExp) {
            this.regExp = regExp;
        }
        
        /** 正则表达式 */
        public String getRegExp() {
            return regExp;
        }
    }
    
    /** 匹配字符串2正则表达式 */
    private static final Map<String, Pattern> patternMapping = new WeakHashMap<>();
    
    /** 获取正则表达式"匹配器类" */
    public static Matcher getMatcher(String regexp, String str) {
        return getPattern(regexp).matcher(str);
    }
    
    /** 获取正则表达式"模式类" */
    public static Pattern getPattern(String regexp) {
        AssertUtils.notEmpty(regexp, "正则表达式不能为空.");
        Pattern pattern = patternMapping.get(regexp);
        if (pattern == null) {
            pattern = Pattern.compile(regexp);
            patternMapping.put(regexp, pattern);
        }
        return pattern;
    }
    
    /** 正则表达式匹配 */
    public static boolean matcher(RegExp regexp, String str) {
        return matcher(regexp.getRegExp(), str);
    }
    
    /** 正则表达式匹配 */
    public static boolean matcher(String regexp, String str) {
        return getMatcher(regexp, str).matches();
    }
}
